package com.atguigu.dw.gmall.realtime.util

import com.atguigu.constan.ConstanVal
import io.searchbox.client.JestClientFactory
import io.searchbox.client.config.HttpClientConfig
import io.searchbox.core.{Bulk, Index}

/**
 * description ：es 工具类
 * author      ：剧情再美终是戏 
 * mail        : 13286520398@163.com
 * date        ：Created in 2020/2/17 18:55
 * modified By ：
 * version:    : 1.0
 */
object EsUtil {

  // es 配置工厂
  val factory = new JestClientFactory()
  val httpClientConfig: HttpClientConfig = new HttpClientConfig
  .Builder(ConstanVal.ES_CLIENT_ADRESS)
    .maxTotalConnection(20)
    .multiThreaded(true)
    .connTimeout(1000 * 10)
    .readTimeout(1000 * 10)
    .build()
  factory.setHttpClientConfig(httpClientConfig)

  def main(args: Array[String]): Unit = {
    // 插入单条测试
    //    val source =
    //      """
    //        |{
    //        |"mid":"mid_2"
    //        |}
    //        |""".stripMargin
    //
    //    inserSingle(ConstanVal.ES_INDEX_GMALL0830_COUPON_ALERT, source)

    // 插入多条测试
    //    val sources = List(AlertInfo("mid_3", new util.HashSet[String](), new util.HashSet[String](), new util.ArrayList[String](), 1231243)
    //      , AlertInfo("mid_4", new util.HashSet[String](), new util.HashSet[String](), new util.ArrayList[String](), 1531243))
    //    insertBulk(ConstanVal.ES_INDEX_GMALL0830_COUPON_ALERT, sources)
  }

  /**
   * 向 es 批量插入数据方法
   *
   * @Author 剧情再美终是戏
   * @Date 2020/2/17 19:38
   * @param index  插入数据的数据库
   * @param source 需要插入的数据 <br/>source格式说明：source|(source : Any, id : String)
   * @return void
   * @Version 1.0
   **/
  def insertBulk(index: String, source: TraversableOnce[Any]): Unit = {
    // 获取连接
    val client = getEsClient()

    // 构建 bulkBuilder
    val bulkBuilder = new Bulk
    .Builder()
      .defaultIndex(index)
      .defaultType(ConstanVal.ES_DEFAULT_DOC)

    // 添加 action
    source.foreach {
      case (source: Any, id: String) =>
        val action = new Index.Builder(source).id(id).build()
        bulkBuilder.addAction(action)
      case (source) =>
        val action = new Index.Builder(source).build()
        bulkBuilder.addAction(action)
    }

    // 写入数据
    client.execute(bulkBuilder.build())

    // 关闭连接
    client.shutdownClient()
  }

  /**
   * 获取 es 连接
   *
   * @Author 剧情再美终是戏
   * @Date 2020/2/17 19:0
   * @return io.searchbox.client.JestClient
   * @Version 1.0
   **/
  def getEsClient() = factory.getObject

  /**
   * 向 es 插入单条数据方法
   *
   * @Author 剧情再美终是戏
   * @Date 2020/2/17 19:29
   * @param index  插入数据的数据库
   * @param source 需要插入的数据
   * @param id     插入数据的id
   * @return void
   * @Version 1.0
   **/
  def inserSingle(index: String, source: Any, id: String = null): Unit = {
    // 获取连接
    val client = getEsClient()

    val builder = new Index.Builder(source)
      .index(index)
      .`type`(ConstanVal.ES_DEFAULT_DOC)

    // 如果 id 不为空，就指定 id
    if (null != id && id.trim.length > 0) builder.id(id)

    // 写入数据
    client.execute(builder.build())

    // 关闭连接
    client.shutdownClient()
  }

}
